2Pascal-新时代的Pascal

标题: 安卓手表与安卓手机的蓝牙通讯问题 [打印本页]

作者: 110302124    时间: 2015-6-16 13:58
标题: 安卓手表与安卓手机的蓝牙通讯问题
本帖最后由 110302124 于 2015-6-16 14:07 编辑

同样的程序两台手机能互相调用蓝牙的connect并发送数据,一台手机和一台手表 同样的程序 手表能connect到手机 并能发送数据 手机向手表发送数据时确connect异常 这大概是什么回事 这个异常一般来说是找不到目标的service服务 才会报错的 但我手机和手表匹配后 能列出手机的蓝牙服务 其中有我需要的uuid对应的服务!   
fServiceName := 'IrMCSyncServiceClass_UUID';
  fServiceGUI := '{00001104-0000-1000-8000-00805F9B34FB}';
[attach]857[/attach]

  java.io.ioexception:read failed,socket might closed or timeout 蓝牙通讯connect出错!



file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\110302124\QQ\WinTemp\RichOle\L3~2KHN543XB{N4U6$@V]GW.png

file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\110302124\QQ\WinTemp\RichOle\L3~2KHN543XB{N4U6$@V]GW.png



作者: 110302124    时间: 2015-6-16 14:00
这是蓝牙线程中开启的等待客户端连接的代码
procedure TServerConnectionTH.Execute;
var
  str,Msg: string;
  err:boolean;
  label reconn;
begin
    try
    reconn:
      ClientSocket := nil;
      err:=false;
      while not Terminated and (ClientSocket = nil) do
       begin
            self.parent.addlog('等待连接...');
            try
            ClientSocket := FServerSocket.Accept();
            except
              on E : Exception do
                begin
                  parent.addlog('err:'+e.Message);

                end;
            end;
            self.parent.addlog('连接成功...');

       end;
      self.parent.addlog('收到clientsocket');
      if(ClientSocket <> nil) then
      begin
        while not Terminated do
        begin
          try
          self.parent.addlog('读取数据...');
          FData := ClientSocket.ReadData;
          self.parent.addlog('读到数据'+inttostr(length(FData)));

          except
            err:=true;
            self.parent.addlog('读数据异常!');
            ClientSocket.DisposeOf();
            break;
          end;
          if length(FData) > 0 then
           begin
                str:=TEncoding.UTF8.GetString(FData);
                parent.revstrs.Add(str);
           end;
          sleep(100);
        end;

      end;
      if err and not terminated then
        begin
           parent.addlog('异常重连');
           goto reconn;
        end;

    except
      on E : Exception do
      begin
        Msg := E.Message;

      end;
    end;
end;
作者: wang_80919    时间: 2015-6-16 14:04
addlog 线程 安全吗?加了同步了吗?
没有的话 卡死活该。
作者: 110302124    时间: 2015-6-16 14:11
procedure TUV_BlueTooth.addlog(logstr: string);
begin
  logs.Add(logstr);
end;
这个肯定没问题
作者: 110302124    时间: 2015-6-16 14:11
程序本身没问题 两台手机能正常收发数据!主要是手表端不能调试 没法跟踪!
作者: wang_80919    时间: 2015-6-16 14:18
110302124 发表于 2015-6-16 14:11
procedure TUV_BlueTooth.addlog(logstr: string);
begin
  logs.Add(logstr);

procedure TServerConnectionTH.Execute;
如果这个是线程。或者他执行的位置,不是 UI 线程。
那么你肯定出问题。

他是不是线程,你知道。

如果他不是线程。那么有些手机上,这个代码,可能没在 UI 线程上执行。

一样出问题。
作者: wang_80919    时间: 2015-6-16 14:20
我就遇到过 JNI  运行的环境,明明不是线程,但是也不是 UI 线程。所以必须进行线程同步,否则完蛋。
作者: 110302124    时间: 2015-6-16 14:29
这个logs是一个tstrings变量,只在主界面的定时器里刷新 而且手表端能显示多个添加进去的logs 因此这个不是问题。
作者: 110302124    时间: 2015-6-16 14:37
FAdapter := FBluetoothManager.CurrentAdapter;
      ServerConnectionTH := TServerConnectionTH.Create(True);
      ServerConnectionTH.parent := self;

      ServerConnectionTH.FServerSocket := FAdapter.CreateServerSocket(fServiceName, StringToGUID(fServiceGUI), False);
      ServerConnectionTH.Start;
      result:=true;
      addlog('create thread');
作者: wang_80919    时间: 2015-6-16 14:53
不信就算了。我问你是不是线程,你都懒得回答。我更懒得去看你的垃圾代码。
作者: 110302124    时间: 2015-6-16 15:10
是线程啊 我擦 ServerConnectionTH.Start;
作者: wang_80919    时间: 2015-6-16 15:12
Start; 就一定是线程吗?
不过,你既然承认这个东西是在线程中运行。

那么发生错误,就是你自找的。
作者: 110302124    时间: 2015-6-16 15:14
是线程啊 ServerConnectionTH.Start; 我在线程的accept函数前 加了三个addlog提示信息 手表上都能显示出来三段文字 因此不用纠结在这个问题上了 addlog没问题




欢迎光临 2Pascal-新时代的Pascal (http://2pascal.com/) Powered by Discuz! X3