| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java ME (J2ME) > Помощь с J2ME и Bluetooth |
| Автор: AlexeySNG 17.7.2012, 10:21 |
| Доброго времени суток! На яве программировать только учусь и синтаксис не совсем понятен для меня. Прошу знающих людей о помощи (при возможности с комментариями) - необходимо реализовать вот какую функцию - телефон с поддержкой JSR-82 при запуске программы постоянно через блютуз сканирует (то есть автоматически, не требуя нажатия кнопок для начала сканирования) и при нахождении устройств проверяет его (найденного устройства) имя, если имя предположим Dev1, Dev2, Dev3 - то переходит на подпрограмму 1, если имя Dev4,Dev5 - переходит на подпрограмму 2, если имя Dev6,Dev7 - на подпрограмму 3 и отображает Dev6, Dev7 в списке найденных устройств. Пожалуйста помогите кто может. Спасибо. |
| Автор: AlexeySNG 18.7.2012, 09:58 |
| Помогите примером пожалуйста. |
| Автор: oxigen 18.7.2012, 10:59 |
| Примером чего? Примеры базовых функций языка Вы можете найти в любой книге по Java Про поиск bluetooth устройств можете почитать тут http://www.rsdn.ru/article/java/bluetooth.xml |
| Автор: AlexeySNG 18.7.2012, 15:45 |
| Вот здесь разъясняется как сделать поиск блютуз устройств http://meego.e-werest.org/blog/j2me/2538.html но дело вот в чём - после поиска устройств мне необходимо проверить имена заранее заданные в программе и выполнить какое либо действие в зависимости от найденного имени не показывая это (найденные устройства) на экране - то есть считать имя найденного устройства, сверить его с заданными, и выполнить действие в зависимости от имени найденного устройства. Сервисы на найденных устройствах искать не надо, это позже. И поиск БТ устройств что бы не останавливался, ну или произвёл поиск, сравнил имена с заданными, выполнил действие, продолжил поиск. По ссылке вроде всё расписано хорошо, пытаюсь делать в NetBeans - куча ошибок. Спасибо заранее. |
| Автор: oxigen 18.7.2012, 17:14 |
| AlexeySNG, давайте свой код, давайте ошибки и тогда можно будет предметно смотреть, что там не так. |
| Автор: AlexeySNG 18.7.2012, 19:52 | ||
Вот какой код, не ругайтес сильно, только начинаю:
Ошибка 1 - deviceDiscovered(javax.bluetooth.RemoteDevice,javax.bluetooth.DeviceClass) in serv_SearchDevice cannot implement deviceDiscovered(javax.bluetooth.RemoteDevice,javax.bluetooth.DeviceClass) in javax.bluetooth.DiscoveryListener attempting to assign weaker access privileges; was public Ошибка 2 - missing method body, or declare abstract Ошибка 3 - cannot find symbol symbol: class BTmidlet location: class serv_SearchDevice Ошибка 4 - cannot find symbol symbol: variable localDevice location: class serv_SearchDevice Вот что пишет при компиляции : Compiling 1 source file to C:\Users\saa\Documents\NetBeansProjects\BTmidlet\build\compiled C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:16: error: cannot find symbol public serv_SearchDevice(BTmidlet midl) { symbol: class BTmidlet location: class serv_SearchDevice C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:25: error: method deviceDiscovered(RemoteDevice,DeviceClass) is already defined in class serv_SearchDevice public void deviceDiscovered(RemoteDevice remoteDevice, C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:29: error: method startServiceSearch(RemoteDevice) is already defined in class serv_SearchDevice private void startServiceSearch(RemoteDevice device) {//Это не надо, сервисы не нужны C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:31: error: method servicesDiscovered(int,ServiceRecord[]) is already defined in class serv_SearchDevice public void servicesDiscovered(int _int, ServiceRecord[] records) {//Это тоже не надо C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:33: error: method serviceSearchCompleted(int,int) is already defined in class serv_SearchDevice public void serviceSearchCompleted(int _int, int _int1) { C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:36: error: method inquiryCompleted(int) is already defined in class serv_SearchDevice public void inquiryCompleted(int _int) { C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:12: error: servicesDiscovered(int,ServiceRecord[]) in serv_SearchDevice cannot implement servicesDiscovered(int,ServiceRecord[]) in DiscoveryListener void servicesDiscovered(int _int, ServiceRecord[] records); attempting to assign weaker access privileges; was public C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:13: error: serviceSearchCompleted(int,int) in serv_SearchDevice cannot implement serviceSearchCompleted(int,int) in DiscoveryListener void serviceSearchCompleted(int _int, int _int1); attempting to assign weaker access privileges; was public C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:14: error: inquiryCompleted(int) in serv_SearchDevice cannot implement inquiryCompleted(int) in DiscoveryListener void inquiryCompleted(int _int); attempting to assign weaker access privileges; was public C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:10: error: deviceDiscovered(RemoteDevice,DeviceClass) in serv_SearchDevice cannot implement deviceDiscovered(RemoteDevice,DeviceClass) in DiscoveryListener void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass); attempting to assign weaker access privileges; was public C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:11: error: missing method body, or declare abstract void startServiceSearch(RemoteDevice device); C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:15: error: missing method body, or declare abstract public serv_SearchDevice(); C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:17: error: cannot find symbol midlet = midl; symbol: variable midlet location: class serv_SearchDevice C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:19: error: cannot find symbol localDevice = LocalDevice.getLocalDevice(); symbol: variable localDevice location: class serv_SearchDevice C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:20: error: cannot find symbol discoveryAgent = localDevice.getDiscoveryAgent(); symbol: variable discoveryAgent location: class serv_SearchDevice C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:20: error: cannot find symbol discoveryAgent = localDevice.getDiscoveryAgent(); symbol: variable localDevice location: class serv_SearchDevice C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:21: error: cannot find symbol discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this); symbol: variable discoveryAgent location: class serv_SearchDevice C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:27: error: cannot find symbol remoteDevices.addElement(remoteDevice); symbol: variable remoteDevices location: class serv_SearchDevice C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:37: error: cannot find symbol for (int i = 0; i < remoteDevices.size(); i++) { symbol: variable remoteDevices location: class serv_SearchDevice C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:39: error: cannot find symbol midlet.ListDev.addElement(((RemoteDevice) remoteDevices.// symbol: variable remoteDevices location: class serv_SearchDevice C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:39: error: package midlet does not exist midlet.ListDev.addElement(((RemoteDevice) remoteDevices.// C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:43: error: cannot find symbol System.out.println("Device: " + remoteDevices); //Это не нужно, ведь отображать найденные устр-ва пока не надо symbol: variable remoteDevices location: class serv_SearchDevice C:\Users\saa\Documents\NetBeansProjects\BTmidlet\src\BTMidlet.java:45: error: cannot find symbol midlet.ShowList(); symbol: variable midlet location: class serv_SearchDevice 23 errors C:\Users\saa\Documents\NetBeansProjects\BTmidlet\nbproject\build-impl.xml:338: Compile failed; see the compiler error output for details. ПОСТРОЕНИЕ ЗАВЕРШЕНО СО СБОЕМ (общее время: 2 секунд) |
| Автор: oxigen 19.7.2012, 10:03 |
| Знаете, есть смысл начать с того, чтоб взять любой учебник по Java и написать Hello world. После этого многие вопросы сами отпадут. А по самому коду: 1. В мобильном приложении должен быть класс, наследник javax.microedition.midlet.MIDlet Это точка входа в программу. 2. Имя класса должно совпадать с именем файла 3. В Java не нужно отдельно декларировать метод и отдельно писать реализацию. Все вместе должно быть. 4. Java строго типизированый язык - все переменные нужно объявлять. 5. Вы обращаетесь к классу BTmidlet, но его нет. |
| Автор: AlexeySNG 19.7.2012, 10:15 | ||
Пытаюсь понять структуру самой программы вот на чём учусь (нашёл в сети)
Код работает без ошибок, но: 1) Мне не нужен вывод на экран 2) Не нужен поиск сервисов в найденных устройствах 3) Из найденных устройств провести проверку найденных имён и перейти на подпрограмму обработки (К примеру - Если в найденных именах присутствует имена Dev1, Dev2 перейти на подпрограмму1 если нет - продолжить поиск) Вопрос данная программа ищет только доступные для поиска устройства, или все? Можно ли как-то разделить поиск доступных и скрытых? Структура программы начинает потихоньку доходить до понимания ;) Классы,подклассы, расширения класса... Добавлено через 3 минуты и 39 секунд Не всё правда понятно, как например переменные объявляются в этом исходнике и где. Как вытащить данные из переменной с найденными БТ устройствами. Книги читаю - вот такую "В. Пирумян - Платформа программирования J2ME для портативных устройств" и вот такую "Горнаков.С. Программирование Мобильных Телефонов НаJ ava2MicroEdition" |
| Автор: oxigen 19.7.2012, 10:31 | ||||||
Примерно так.
Переменные объявляются вот тут переменные - поля класса. Видимые во всем классе
Или вот тут - локальная. Видимая только внутри метода
Скрытые для поиска потому и скрытые, что их нельзя найти. |
| Автор: AlexeySNG 19.7.2012, 11:20 |
| Спасибо за ответ - с Вашей помощью понимать начинаю. Есть вопрос к Вам - Можно ли на J2ME написать программу что бы она динамически проверяла найденные по именам устройства, а не дожидалась завершения поиска, то есть запускаем поиск по блютуз и динамически (не останавливая поиск) проверяем найденные имена. Такое вообще возможно? Что то вроде радара... |
| Автор: oxigen 19.7.2012, 12:47 | ||||
| Да. Смотрите: Метод
Вызывается каждый раз, когда найдено очередное устройство. Делайте тут с найденым устройством что хотите. Сейчас оно просто сохраняется в векторе. Метод
вызывается, когда поиск закончен. Можете сразу же тут стартовать поиск заново. serv_SearchDevice() - запускает поиск. Интересно, за сколько времени подобное батарейку полностью скушает. |
| Автор: AlexeySNG 19.7.2012, 13:29 | ||
Ну батарейка это как говорится дело наживное
Правда int где объявить? |
| Автор: oxigen 19.7.2012, 13:35 | ||
| Нет. Что-то Вы тут намудрили. Вы нашли одно устройство. С этим одним устройством и работаете.
Правда int где объявить? Это Вы о чем? int это тип. |
| Автор: AlexeySNG 19.7.2012, 14:11 | ||
Изменяюсь за ерунду с int - только учусь. Получается если устройства с нужными именами не найдены то эта процедура повторится пока не найдутся или этот кусок надо постоянно вызывать?
Спасибо. З.Ы. Я в асме для микроконтроллеров пишу, ява это для меня новое... Добавлено через 3 минуты и 48 секунд Кстати а имена устройств где нибудь (в какой нибудь переменной/переменных) можно перечислить нужные, а потом оттуда брать и сравнивать? |
| Автор: oxigen 19.7.2012, 15:51 |
| Получается если устройства с нужными именами не найдены то эта процедура повторится пока не найдутся или этот кусок надо постоянно вызывать? Смотри, как оно работает. Вызываешь discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this); Дальше оно само там что-то как-то ищет. Как и каким образом, нам не видно. Но как только найдет одно устройство - сработает твой метод public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass) {} И в параметрах придет информация о найденом устройстве. И так раз за разом, пока не найдет все. Как только все нашлось (или поиск прервался по другим причинам) - вызовется public void inquiryCompleted(int arg) {} То есть сам ты вызываешь только discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this), когда хочешь начать поиск. Остальное происходит "само по себе". Кстати а имена устройств где нибудь (в какой нибудь переменной/переменных) можно перечислить нужные, а потом оттуда брать и сравнивать? Массив, вектор... |
| Автор: AlexeySNG 19.7.2012, 18:26 | ||
Извиняюсь за свою назойливость, порылся по форуму и гуглу, нашёл одну процедуру с массивом и вектором, но никак не пойму что здесь к чему
Спасибо заранее. |
| Автор: AlexeySNG 19.7.2012, 20:01 | ||||
Вот будет наверное правильно....
Как проверять из этого списка ещё не разобрался В строке -
Я уже и в try-catch пробовал как NetBeans предлагал, не помогло... Извиняюсь - try-catch помог, но правильно ли это вот вопрос? |
| Автор: AlexeySNG 20.7.2012, 10:45 | ||||||
Вот что получилось, но на реальном телефоне не работает, вернее запускается но сообщений не выдаёт (имена в устройствах (телефоны) Dev1 и Dev2:
Может правильнее вставить вот такие строки перед
|
| Автор: oxigen 20.7.2012, 11:05 | ||||||
Или массив или вектор. Одного достаточно. А тут вектор в котором массивы хранятся... Вектор:
(вариантс двойными скобками тоже работать будет, но это скорее из разряда фокусов, а не нормального кода) Массив:
try-catch не только правильный, но единственно возможный вариант. Добавлено @ 11:16 - мы же из remoteDevice вроде как получить пытаемся, а туда ничего не заносим... remoteDevice и remoteDevices совершенно разные вещи. remoteDevices вообще не нужен сейчас. discoveryAgent ищет устройства, а когда находит - кладет инфо о найденом устройстве в remoteDevice и отдает ее. Как параметр метода public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass). А сообщения ты создал, но просто забыл показать ;) mydisplay.setCurrent(myAlert); p.s. Ничего, что я на ты? |
| Автор: AlexeySNG 20.7.2012, 12:47 |
| На ты и мне хотелось бы, так проще. Мне бы вашу голову! Не просто с асма перейти... В асме создал процедуру и вызывай её по call или всяким там переходам условным/безусловным.... |
| Автор: AlexeySNG 21.7.2012, 16:00 | ||||||
У меня опять проблема
Может нужно очищать переменную remoteDevice? И переменную name тоже? Только как?
Ещё два вопроса - 1) Можно ли сделать проверку не по всему имени, а по допустим первым трём или четырём буквам имени, и если они совпали перейти на программу которая уже будет полное имя обрабатывать? 2) Разбирался с исходниками в NetBeans-е - программа (большая-к примеру игра) состоит из нескольких файлов один это меню, второй - это к примеру движек игры - вопрос такой как они вызываются или запускаются в программе, я посмотрел а явных вызовов нет? Предположим что файл движка игры называется Engine.class вызываться должен из программы menu.class , но всё что удалось найти это gEngine - не похоже на вызов движка, пролез всё... Ещё вопрос - можно ли вот в этой части
вместо if - else использовать switch(), и как? (Прочитал что в switch можно больше вариантов проверки реализовать чем в if-else) Спасибо заранее |
| Автор: oxigen 23.7.2012, 11:30 | ||
| 1. Похоже что проблема не в программе, а в самом телефоне. Посмотри, как штатный поиск bluetooth устройств работает. Так же, как приложение не реагирует на смену имени? 2. Никакой очистки переменных в java нет. Собственно это и не переменные, а указатели. 3. name.startsWith("Dev1") как следует из названия как раз проверяет первые символы имени. Напиши свой метод и передавай ему полное имя
4. Посмотри на инициализацию gEngine. Там скорее всего что-то вроде Engine gEngine; ..... gEngine = new Engine(); Это оно и есть. gEngine указатель на объект класса Engine 5. И if-else-if и switch-case можно использовать без ограничений на число вариантов. Но в данном случае выбора нет. switch-case со строками не работает. |
| Автор: AlexeySNG 25.7.2012, 07:57 |
| Пробовал на других телефонах (Nokia N82 и Sony-Erricsson W595) - на N82 примерно похожая ситуация, только после перезапуска приложения находит устройство с другим именем, на SE W595 перезапуск не требуется, но необходимо дождаться следующего цикла поиска (индикатор на SE показывает циклы поиска). |