您好,Garmin 开发人员,
我一直在尝试通过 BLE 在我的 Android 应用程序和我的 connectIQ 应用程序(在 Garmin Forerunner 230,SDK 版本 1.3.x 上)之间开发直接消息通信设置。这里的目标是 Android 应用程序收集一些数据,然后将其推送到 watch 应用程序。
以下关于 developer site 的详细信息,我已经设法让它工作,但是有很多丢弃的消息没有被发送,而且 watch 接收到的值少于发送的值。
在 Android 上,我在调试语句中获得此状态 (ConnectIQ.IQMessageStatus) = FAILURE_DURING_TRANSFER。 '240' 是正在发送的数据。
D/GarminMessenger: onMessageStatus: Message: 240, device: Forerunner 230, FAILURE_DURING_TRANSFER
这是我在 garmin 上的应用程序代码:
示例应用程序.mc
using Toybox.Application as App;
using Toybox.Communications as Comm;
using Toybox.WatchUi as Ui;
using Toybox.System as Sys;
var mailMethod;
var crashOnMessage = false;
var msg;
class SampleApp extends App.AppBase {
function initialize() {
AppBase.initialize();
Sys.println("app-initialize()");
msg = "0";
mailMethod = method(:onMail);
Comm.setMailboxListener(mailMethod);
Sys.println("app-initialize(): mail box listener has been set");
}
// onStart() is called on application start up
function onStart(state) {
System.println("app-onStart()");
}
// Return the initial view of your application here
function getInitialView() {
Sys.println("app-getInitialView()");
return [ new SampleAppView() ];
}
function onMail(mailIter) {
var mail = mailIter.next();
while(mail!=null) {
Sys.println("app-onMail: received - "+mail);
message = mail.toString();
Ui.requestUpdate();
mail = mailIter.next();
}
Comm.emptyMailbox();
}
// onStop() is called when your application is exiting
function onStop(state) {
System.println("app-onStop()");
}
}
class CommListener extends Comm.ConnectionListener {
function initialize() {
Comm.ConnectionListener.initialize();
sys.println("commlistener-initialize");
}
function onComplete() {
Sys.println("commlistener-onComplete: Transmit Complete");
}
function onError() {
Sys.println("commlistener-onError: Transmit Failed");
}
}
关于可能导致此问题的原因有什么想法吗?我正在 Android 端执行所有必要的检查,以验证 Garmin watch 是否已配对并连接(应用程序已打开)。
发生这种情况的一个原因是我试图每秒发送 1-2 个数据值(每个数据值都有一个 ConnectIQ.sendMessage()),所以 Garmin 设备/BLE 模块可能不支持以该速率进行通信?
提前感谢您提供解决方案和建议。
最佳答案
我认为 Connect 消息传递系统刚刚进入某种损坏状态,然后没有消息将通过。 您可以尝试在 onStart 方法中设置邮箱监听器而不是初始化。
还有一种新方法可以使消息阅读更容易。它在很大程度上仍未记录,但我听说它将在下一个 SDK 版本中记录。但是,它已经在每个 ConnectIQ watch 上运行。 方法是:
Comm.registerForPhoneAppMessages(方法(:onMsg));
您在回调方法中执行的操作:
function onMsg(msg) {
handleIncomingMessage(msg.data.toString());
}
或类似的东西。输入对象 msg 属于类
Toybox::Communications::Message
可能(这还没有记录)。
关于java - Android 和 Garmin FR230 (SDK 1.3.x) 之间通过 BLE 的直接消息通信失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41306890/