java - Android 和 Garmin FR230 (SDK 1.3.x) 之间通过 BLE 的直接消息通信失败

标签 java android bluetooth garmin connectiq

您好,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/

相关文章:

java - 找不到 key.serializer 的类

java - OpenCV Java JNIEXPORT 内存管理

java - 拆分成句子Java

java - 如何从ArrayAdapter列表中启动新的Fragment?

android - Firebase 快速入门分析无法解析 ':app@debug/compileClasspath' : Could not resolve project :internal:lintchecks 的依赖关系

Android 蓝牙 LE - BluetoothGatt - onNotify 停止接收数据

android - 关于在 Android 应用程序中实现 OBEX 的任何示例?

java - 在 arrayList 中搜索特定输入以生成更小的 arrayList

php - wamp 服务器可以与模拟器一起使用,但不能与任何其他 Android 手机一起使用

iOS kontakt.io 信标搜索