从蓝牙设备获取响应

3 投票
1 回答
5388 浏览
提问于 2025-04-15 11:57

我正在尝试写一个简单的模块,用来发送短信。我使用蓝牙连接手机,下面是我的代码示例:

文件:bt-sendsms.py

import bluetooth

target = '00:32:AC:32:36:E8' #  Mobile address 
print "Trying to send SMS on %s" %  target

BTSocket = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
BTSocket.connect((target, 2)) # BT Address
BTSocket.send('ATZ\r')
BTSocket.send('AT+CMGF=1\r')
#sockfd.send('AT+CSCA="+972547716507"\r') # This line changes the SMSC address - do not modify unless required 
BTSocket.send('AT+CMGS="+972547877763"\r') # TO Phone Number
BTSocket.send('This is a test message - port 2.\n')
BTSocket.send(chr(26)) # CTRL+Z

print "SMS sent"
sockfd.close()
print "Closed" 

我的问题是,我无法确认短信是否发送成功,也得不到任何关于发送短信或其他网络操作的错误代码。

如果能给我一些正确的方向建议,我会非常感激。

1 个回答

3

从你写的Python代码来看,你似乎是在随便打开一个RFCOMM通道,希望它能神奇地接受AT命令并进行消息传递。

我觉得(可能我错了)你需要连接到一个特定的配置文件或服务通道,而对于短信来说,这个通道应该是消息访问配置文件(MAP)。不过这个标准还没有完全确定,所以找到一个支持这个的手机,嗯,我不能说完全不可能,但确实非常非常不容易。除此之外,有些手机会支持用于消息的AT命令,但这不在标准范围内。例如,我听说索尼爱立信的手机通过拨号网络配置文件(DUN)会支持这些命令。

所以,首先,你的手机设备是否支持一些不在标准范围内的AT命令用于短信?如果支持的话,是在某个特定的配置文件上,还是在一个临时的专有配置上?接下来,你需要连接到那个配置。

你可以使用以下Python代码浏览支持的服务等信息(这段代码会检查周围的蓝牙设备)...

import bluetooth

def whats_nearby():
    name_by_addr = {}
    nearby = bluetooth.discover_devices(flush_cache=True)
    for bd_addr in nearby:
        name = bluetooth.lookup_name( bd_addr, 5)
        print bd_addr, name
        name_by_addr[bd_addr] = name
    return name_by_addr

def what_services( addr, name ):
    print " %s - %s" % ( addr, name )
    for services in bluetooth.find_service(address = addr): 
        print "\t Name:           %s" % (services["name"]) 
        print "\t Description:    %s" % (services["description"]) 
        print "\t Protocol:       %s" % (services["protocol"]) 
        print "\t Provider:       %s" % (services["provider"]) 
        print "\t Port:           %s" % (services["port"]) 
        print "\t service-classes %s" % (services["service-classes"])
        print "\t profiles        %s" % (services["profiles"])
        print "\t Service id:  %s" % (services["service-id"]) 
        print "" 

if __name__ == "__main__":
    name_by_addr = whats_nearby()
    for addr in name_by_addr.keys():
        what_services(addr, name_by_addr[addr])

一旦你找到正确的服务或配置,接下来的问题就是如何处理安全性(配对时的PIN码),这部分我还没搞明白怎么做!

想了解更多蓝牙相关的信息,可以去 www.bluetooth.org

撰写回答