上一节我做了mavlilnk的接收部分,接下来我做的是发送

要发送对应的消息,首先你要构造消息的数据。大家都在想是不是要一个个消息做出来,然后发给NDK去实现 encode。不是的,这里我取了一个巧,同样是mavlink生成工具,这次我生成TS代码,不是说TS代码没有unpack和pack么?,是的,没有,但是丝毫不影响使用消息啊!这样就不用我们一个个去创建了,我们只要调用就可以了
首先将ts代码放到项目中

在这里插入图片描述
将node_mavlink 去掉,自己写一个消息父类 给用到的继承,现在可以只去掉引用和继承,后面为了管理可以统一做一个父类继承。你想说这么多弄到什么时候?,你用到哪个消息你就改哪个,编译不会报错,后面害怕会有影响,我们等后来的高手去解决,我这里就直接调用就可以了。

自定义一个降落的消息,每个公司有自己 的,不会你可以去看你们公司安卓版的,
调用
let landMsg = LinkMsgManager.getLandMsg() //自己写的静态方法

export class LinkMsgManager{


//我这的具体参数我就不写出来了,写0 你们后面自己改
  static getLandMsg():CommandLong{
    let msg = new CommandLong()
    msg.command = 0 
    msg.param1 = 0 
    msg.param2 = 0
    msg.param3 = 0
    msg.target_system = 1
    msg.target_component = 1
		return msg;
	}
}

//调用的方法
//第一个是消息id 第二个是结构体,我把id放这里是提醒自己要放什么消息以免大意,
// 大家可以去掉,因为obj里面已经有消息ID了

发送之前可以添加这两个 不一定要放这里
    obj['sysid'] =  0
    obj['compid'] = 1

let objbyte: Uint8Array = testNapi.mavLinkObject2buffer(obj['_message_id'], obj)

  console.log("yqj----无符号array---->" + Array.from(objbyte))
//C代码只有无符号的数据,这里要转一下然后传给udp.sendMsg 
    const sendBuffer =  objbyte.buffer
    const int8buffer = new Int8Array(sendBuffer);
    
  UdpUtils.getInstance().sendMsg(int8buffer, address.ip, address.port)

前面是调用,大家可以先看看逻辑,然后我们来实现具体的

//mavLinkObject2buffer



static napi_value MavlinkMsgToByte(napi_env env, napi_callback_info info) {

    size_t argc = 2;
    napi_value args[2];
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
    // 检查参数个数
    if (argc < 2) {
        napi_throw_error(env, nullptr, "Missing  argument");
        return nullptr;
    }
    // 获取整数参数
    int32_t number;
    napi_get_value_int32(env, args[0], &number);


    napi_value result = nullptr;
    napi_get_prototype(env, args[1], &result);
    napi_value property_names;
    napi_get_property_names(env, result, &property_names);

    // 检查参数类型
    napi_valuetype param_type;
    napi_typeof(env, args[1], &param_type);
    if (param_type != napi_object) {
        napi_throw_type_error(env, "ETYPE", "Argument must be an object");
        return nullptr;
    }
    mavlink_message_t msg;
    msg.sysid = SafeGetIntProperty(env, args[1], "sysid", 0);
    msg.compid = SafeGetIntProperty(env, args[1], "compid", 1);
    // 根据消息ID处理
    switch (number) {
    case 76:
        mavlink_command_long_t command_msg;
	    command_msg.param1 = SafeGetIntProperty(env, args[1], "param1", 0);
        command_msg.param2 = SafeGetIntProperty(env, args[1], "param2", 0);
        command_msg.param3 = SafeGetIntProperty(env, args[1], "param3", 0);
        command_msg.param4 = SafeGetIntProperty(env, args[1], "param4", 0);
        command_msg.param5 = SafeGetIntProperty(env, args[1], "param5", 0);
        command_msg.param6 = SafeGetIntProperty(env, args[1], "param6", 0);
        command_msg.param7 = SafeGetIntProperty(env, args[1], "param7", 0);
        command_msg.command = SafeGetIntProperty(env, args[1], "command", 0);
        command_msg.target_system = SafeGetIntProperty(env, args[1], "target_system", 1);
        command_msg.target_component = SafeGetIntProperty(env, args[1], "target_component", 0);
        command_msg.confirmation = SafeGetIntProperty(env, args[1], "confirmation", 1);


        command_msg.target_system = 1;
        command_msg.target_component = 1;
        command_msg.confirmation = 1;
        //这下就拿到了 mavlink_message_t  下面的0,1,是system_id和
        //component_id  你们也可以自己在obj里面加参数然后传进来放。
        mavlink_msg_command_long_encode(msg.sysid, msg.compid, &msg, &command_msg);
        //mavlink_msg_command_long_encode(0, 1, &msg, &command_msg);
        break;
        }
 
    int len = 0;
    // 构造数据包字节
    const size_t bufferSize = 300;
    uint8_t buffer[bufferSize];
    len = mavlink_msg_to_send_buffer(buffer, &msg);
//
    // 创建ArrayBuffer,并复制数据
    void *arrayBufferPtr = nullptr;
    napi_value outputArray;
    // 使用napi_create_typedarray创建一个Array对象,并将externalBuffer对象作为参数传入
    napi_create_arraybuffer(env, len, &arrayBufferPtr, &outputArray);
    // 将数据复制到ArrayBuffer
    memcpy(arrayBufferPtr, buffer, len);
    napi_value uint8Array;
    napi_create_typedarray(env, napi_uint8_array, len, outputArray, 0, &uint8Array);
    return uint8Array; //这里就能拿到值了    
 }
//同样有个取值的方法

template <typename T>
T SafeGetIntProperty(napi_env env, napi_value object, const char *prop_name, T default_value = 0) {
    // 检查属性是否存在
    bool has_property = false;
    napi_has_named_property(env, object, prop_name, &has_property);
    if (!has_property) {
        return default_value;
    }

    // 获取属性值
    napi_value value;
    napi_get_named_property(env, object, prop_name, &value);

    // 检查类型
    napi_valuetype value_type;
    napi_typeof(env, value, &value_type);
    if (value_type != napi_number) {
        return default_value;
    }

    // 根据目标类型获取值
    if constexpr (std::is_same<T, int32_t>::value || std::is_same<T, short>::value || std::is_same<T, int>::value) {
        int32_t num_value;
        napi_get_value_int32(env, value, &num_value);
        return static_cast<T>(num_value);
    } else if constexpr (std::is_same<T, int64_t>::value || std::is_same<T, long>::value ||
                         std::is_same<T, long long>::value) {
        int64_t num_value;
        napi_get_value_int64(env, value, &num_value);
        return static_cast<T>(num_value);
    } else {
        // 不支持的整数类型,返回默认值
        return default_value;
    }
}

是不是很简单,哈哈哈,骗你的,这只是一个消息,自己要发送什么消息自己写,会用一个,其他的相信你们花时间画瓢也能做出来
文章虽然简单,但实现了这个,自然可以和使用java版代码一样的套路,就是要在这个基础上,多写你要的接收和发送的消息结构。

好了,到此结束希望 大家早日可以起飞降落返航写航线,

起飞咯

在这里插入图片描述

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐