From 64bff0caaf665c65125cdab2b144f3594d520002 Mon Sep 17 00:00:00 2001 From: lichao <lichao@aiotlink.com> Date: 星期二, 20 四月 2021 18:39:52 +0800 Subject: [PATCH] go api works. refactor. --- api/go/bhome_node.go | 104 +++++++++++++++++++++++++++++++++------------------- 1 files changed, 66 insertions(+), 38 deletions(-) diff --git a/api/go/bhome_node.go b/api/go/bhome_node.go index f4db490..6669a93 100644 --- a/api/go/bhome_node.go +++ b/api/go/bhome_node.go @@ -1,37 +1,16 @@ package main /* -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stdint.h> -#include "bh_api.h" - -void print(int v) -{ - printf("print %d\n", v); -} - -static void ReadData(void **p, int32_t *n) -{ - *n = 4; - *p = malloc(4); - memcpy(*p, "abc", 4); - *n = 4; -} -static void PrintData(void *p, int32_t n) -{ - printf("data :%s\n", (char*)p); - free(p); -} +#include "bh_api_go.h" */ // #cgo LDFLAGS: -L/home/lichao/code/shmsg/build/lib -L/usr/local/lib -lbhome_shmq -lbhome_msg -lprotobuf-lite -lstdc++ -lpthread -lrt import "C" import ( - bh "bhome/bhome_msg" + bh "bhome_node/bhome_msg" "fmt" + "time" "unsafe" ) @@ -147,36 +126,70 @@ } -type ServecCB func(src unsafe.Pointer, proc_id *string, req *bh.MsgRequestTopic) -type SubDataCB func(proc_id *string, pub *bh.MsgPublish) +type ServerCB func(src unsafe.Pointer, proc_id *string, req *bh.MsgRequestTopic) type ClientCB func(proc_id *string, msg_id *[]byte, reply *bh.MsgRequestTopicReply) +type SubDataCB func(proc_id *string, pub *bh.MsgPublish) -func cserver_callback(cpid unsafe.Pointer, pid_len C.int, src unsafe.Pointer) { +var cgoServerCB ServerCB +var cgoClientCB ClientCB +var cgoSubDataCB SubDataCB +//export CGoSubDataCallback +func CGoSubDataCallback(cpid C.PCVoid, pid_len C.int, data C.PCVoid, data_len C.int) { + proc_id := string(C.GoBytes(unsafe.Pointer(cpid), pid_len)) + msg := bh.MsgPublish{} + msg.Unmarshal(C.GoBytes(unsafe.Pointer(data), data_len)) + cgoSubDataCB(&proc_id, &msg) } -func StartWorker(server_cb ServecCB, sub_cb SubDataCB, client_cb ClientCB) { +//export CGoServerCallback +func CGoServerCallback(cpid C.PCVoid, pid_len C.int, data C.PCVoid, data_len C.int, src unsafe.Pointer) { + proc_id := string(C.GoBytes(unsafe.Pointer(cpid), pid_len)) + msg := bh.MsgRequestTopic{} + msg.Unmarshal(C.GoBytes(unsafe.Pointer(data), data_len)) + cgoServerCB(src, &proc_id, &msg) +} + +//export CGoClientCallback +func CGoClientCallback(cpid C.PCVoid, pid_len C.int, msgid C.PCVoid, msgid_len C.int, data C.PCVoid, data_len C.int) { + proc_id := string(C.GoBytes(unsafe.Pointer(cpid), pid_len)) + msg_id := C.GoBytes(unsafe.Pointer(msgid), msgid_len) + var msg bh.MsgRequestTopicReply + msg.Unmarshal(C.GoBytes(unsafe.Pointer(data), data_len)) + cgoClientCB(&proc_id, &msg_id, &msg) +} + +func StartWorker(c ClientCB, s ServerCB, sub SubDataCB) { + cgoClientCB = c + cgoServerCB = s + cgoSubDataCB = sub + C.CGoStartWorker() } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // user code: -func ServerCallback(proc_id *string, req *bh.MsgRequestTopic, reply *bh.MsgRequestTopicReply) bool { - // xxxx - return true +func ServerCallback(src unsafe.Pointer, proc_id *string, req *bh.MsgRequestTopic) { + fmt.Println("user server cb called, request topic: " + string(req.Topic) + ", data:" + string(req.Data)) + reply := bh.MsgRequestTopicReply{} + reply.Data = []byte("reply 1234") + SendReply(src, &reply) } func SubDataCallback(proc_id *string, pub *bh.MsgPublish) { - + fmt.Println("user sub data cb called") } func ClientCallback(proc_id *string, msg_id *[]byte, reply *bh.MsgRequestTopicReply) { - + fmt.Println("user client cb reply: " + string(reply.Data)) } func main() { + proc_id := "test_proc" proc := bh.ProcInfo{} - proc.ProcId = []byte("test_proc") + proc.ProcId = []byte(proc_id) reply := bh.MsgCommonReply{} + + StartWorker(ClientCallback, ServerCallback, SubDataCallback) r := Register(&proc, &reply, 1000) if r { @@ -201,9 +214,24 @@ } else { fmt.Println("reg topics failed") } + req := bh.MsgRequestTopic{} + time.Sleep(time.Second * 1) + req.Topic = []byte("topic0") + req.Data = []byte("data0") + // var msg_id []byte + // AsyncRequest(&req, &msg_id) + // fmt.Println(msg_id) + // time.Sleep(time.Second * 5) - p := unsafe.Pointer(nil) - n := C.int32_t(0) - C.ReadData(&p, &n) - C.PrintData(p, n) + pid := "" + rr := bh.MsgRequestTopicReply{} + for i := 0; i < 10000; i++ { + if Request(&req, &pid, &rr, 3000) { + fmt.Println("server:" + pid + ", reply:" + string(rr.Data)) + } else { + e, s := GetLastError() + fmt.Println("ec:", e, ", msg:"+s) + } + } + } -- Gitblit v1.8.0