Android与Kannel互传DataMessage:从Kannel接收该消息是否可行?
当然可以实现Kannel接收Android发送的DataMessage!我帮你梳理下具体的实现步骤和关键配置点:
一、Kannel对DataMessage的支持说明
Kannel的smsbox组件本身完全支持处理二进制SMS(也就是你说的DataMessage),核心是要做好Kannel的配置调整,同时确保Android端发送的消息格式符合要求。
二、Kannel配置关键调整
你需要在kannel.conf里做两处核心配置:
- SMS中心(smsc)配置:如果用的是GSM模块,确保smsc类型支持二进制消息,比如:
group = smsc smsc = at modemtype = auto device = /dev/ttyUSB0 speed = 115200 binary-sms = yes
binary-sms = yes是开启二进制消息处理的关键参数。
- 短信服务(sms-service)配置:添加专门处理二进制消息的路由,把收到的DataMessage转发到你的后端服务(或者做内部处理):
group = sms-service keyword = default binary = yes # 把消息转发到你的后端接口,%p是发送方号码,%b是二进制数据(十六进制格式),%P是消息端口 get-url = "http://your-backend-service.com/receive-data?sender=%p&binary_data=%b&port=%P"
三、Android端发送DataMessage的注意事项
你已经在使用SmsManager.sendDataMessage,这里要注意两个关键参数:
- 端口(port):发送时指定一个固定端口(比如
1234),Kannel可以通过这个端口识别并处理DataMessage,后续Android接收Kannel的DataMessage也可以用同一个端口。 - 数据长度:GSM二进制SMS的最大长度是140字节,要确保你发送的
data参数不超过这个限制。
四、Android Manifest接收配置补充
你提供的SmsReceiver需要补充DataMessage对应的Intent Filter和权限,完整配置示例:
<!-- 必要权限 --> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <!-- Android 12+ 还需要通知权限 --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <receiver android:name=".SmsReceiver" android:exported="true"> <intent-filter android:priority="1000"> <!-- 接收普通文本短信 --> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> <!-- 接收DataMessage核心Action --> <action android:name="android.provider.Telephony.DATA_SMS_RECEIVED" /> <!-- 指定监听的端口,和发送时的端口保持一致 --> <data android:port="1234" /> </intent-filter> </receiver>
注意:Android 6.0及以上需要动态申请RECEIVE_SMS和READ_SMS权限,Android 12+还要动态申请POST_NOTIFICATIONS权限。
五、测试验证步骤
- 重启Kannel服务,确保新配置生效;
- 在Android端调用
sendDataMessage发送指定端口的二进制数据到Kannel绑定的号码; - 查看Kannel的日志文件(默认是
kannel.log),如果出现类似Received binary SMS from [你的Android号码] port 1234的日志,说明Kannel已经成功接收; - 检查你的后端服务(如果配置了
get-url)是否收到转发的请求,验证数据是否正确。
内容的提问来源于stack exchange,提问作者nouha
相关产品推荐
相关产品推荐

