鸿蒙 Harmony OS 实现mavlink 使用的NDK2 (发送部分)
·
上一节我做了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], ¶m_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版代码一样的套路,就是要在这个基础上,多写你要的接收和发送的消息结构。
好了,到此结束希望 大家早日可以起飞降落返航写航线,
起飞咯

更多推荐



所有评论(0)