New Android TV Remote Service - Android TV General

Hi,
Since Google has deployed the new version of Android TV Remote Service (in September 2021), the old applications are not able to pair anymore with Android TV devices…
Does anyone know if Google has an official documentation on how to pair with the new Android TV Remote Service? If no document exists, do you know any app (other than the ones created by Google) that works with the new service? Or any developers discussions about it?
I was able to reverse-engineering the old protocol, but with this new update I have to restart from scratch…
Any help would be appreciated.
Thanks

Exactly. We are giving our head around it. Can someone please help us?

I built a documentation for the ATV Remote Protocol v2: https://github.com/Aymkdn/assistant...oogle-TV-(aka-Android-TV)-Remote-Control-(v2)

Jarod_ said:
Hi,
Since Google has deployed the new version of Android TV Remote Service (in September 2021), the old applications are not able to pair anymore with Android TV devices…
Does anyone know if Google has an official documentation on how to pair with the new Android TV Remote Service? If no document exists, do you know any app (other than the ones created by Google) that works with the new service? Or any developers discussions about it?
I was able to reverse-engineering the old protocol, but with this new update I have to restart from scratch…
Any help would be appreciated.
Thanks
Click to expand...
Click to collapse
Yes, Old protocol works. But Android Remote V1 Protocol documentation does not give any info how to send keyboard keys.
Could you please share the Protocol v1 documentation how to send keyboard keys?

Jarod_ said:
I built a documentation for the ATV Remote Protocol v2: https://github.com/Aymkdn/assistant...oogle-TV-(aka-Android-TV)-Remote-Control-(v2)
Click to expand...
Click to collapse
Thanks for sharing this valuable document.
Could you please point to some doc which shows how to control the tv keyboard? Document explains everything except the keyboard and voice controls...

gcc1 said:
Yes, Old protocol works. But Android Remote V1 Protocol documentation does not give any info how to send keyboard keys.
Could you please share the Protocol v1 documentation how to send keyboard keys?
Click to expand...
Click to collapse
Everything is already explained in the documentation https://github.com/Aymkdn/assistant...ka-Android-TV)-Remote-Control#step-3-commands
As explained, if you want to send "B" you will use the code 30 : https://developer.android.com/reference/android/view/KeyEvent#KEYCODE_B

Jarod_ said:
Everything is already explained in the documentation https://github.com/Aymkdn/assistant...ka-Android-TV)-Remote-Control#step-3-commands
As explained, if you want to send "B" you will use the code 30 : https://developer.android.com/reference/android/view/KeyEvent#KEYCODE_B
Click to expand...
Click to collapse
Hi,
You are right its explained in the command section. But it only works for NON Keyboard commands like Volume/Channel/Home/Navigation.
It does not work for Keyboard Characters. it only works for numeric keys form 0-9.
For example if I want to send Keyboard Numeric key 3 (KEYCODE_3), Following is the command and it works.
Same format works for volume/mute/home etc. with their corresponding keycodes.
Press
01 02 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09
Release
01 02 00 10 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00 09
Now if I want to send Keyboard Character 'B' (KEYBOARD_B), Following is the command and it does not works.
Nothing appears in the TV Search Box !!
Press
01 02 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1e
Release
01 02 00 10 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00 1e
Though I have seen official android TV App and other 3rd party apps which handles it very well.
The moment search box is opened on the TV, TV's Gboard keyboard gets disappeared and One bottom Banner saying Use the keyboard on your mobile device appears.
Now whatever is typed on the Phone Remote app, it appears on the TV Search box. Do you have any idea what intent is sent to TV to enable this new keyboard which facilitates the typing?
I am attaching the Screenshots how it look like when TV search keyboard disappears and another appears. Pasting the official android app link and other 3rd party link which handles it well.
Official Android TV Remote App
Third Party Remote App
{
"lightbox_close": "Close",
"lightbox_next": "Next",
"lightbox_previous": "Previous",
"lightbox_error": "The requested content cannot be loaded. Please try again later.",
"lightbox_start_slideshow": "Start slideshow",
"lightbox_stop_slideshow": "Stop slideshow",
"lightbox_full_screen": "Full screen",
"lightbox_thumbnails": "Thumbnails",
"lightbox_download": "Download",
"lightbox_share": "Share",
"lightbox_zoom": "Zoom",
"lightbox_new_window": "New window",
"lightbox_toggle_sidebar": "Toggle sidebar"
}
Gboard Keyboard
Keyboard which handles the remote keyboard inputs

Sorry but I don't know... I'm not using it it this way.

@gcc1 @Jarod_ Thanks for the doc. I was trying to build remote for Android to Android TV. Can u please help how to achieve the same in Java as what i saw in the doc is PHP Code.
Can u help how to achive it in Java.

google has release new remote app its now included in google home app !

PuckBass said:
google has release new remote app its now included in google home app !
Click to expand...
Click to collapse
As you can see in my question, i am not asking for 3rd party apps. we all know there are many apps which are doing this.
THIS IS ABOUT HOW TO DO IT BY MYSELF AND WRITE A JAVA LIB FOR THAT.

You can use the Android TV remote to
Navigate the TV screen.
Control media.
Turn the TV on or off.
Activate the Google Assistant.
Change the volume.
Enter text to perform searches or enter login information.

Any keyboard for Android TV which has full-size? I mean like hacker keyboard but support remote?

Hi, for this exact reason, I've developed my own remote control app using bluetooth HID API's.
It is the only free, ad-free and open source Bluetooth remote on the Play Store.
Bluetooth Remote & Mouse - Apps on Google Play
A Bluetooth remote application for Android TV and other devices.
play.google.com

hi i have a question
when i add the last 2 charecters to the hash of the secret - what do i need to add?
the last 2 charecters from hex string to byte[]? or from regular string to byte[]?

Eliran123 said:
hi i have a question
when i add the last 2 charecters to the hash of the secret - what do i need to add?
the last 2 charecters from hex string to byte[]? or from regular string to byte[]?
Click to expand...
Click to collapse
In my PHP code I do the below:
PHP:
// use SHA-256
$ctxHash = hash_init('sha256');
hash_update($ctxHash, $clientModulus);
hash_update($ctxHash, $clientExponent);
hash_update($ctxHash, $serverModulus);
hash_update($ctxHash, $serverExponent);
// only keep the last two characters of the code
hash_update($ctxHash, hex2bin(sübstr($code, 2, 4))); /// HERE
$alpha = hash_final($ctxHash, true);
So, I convert the last two characters from hexadecimal to bin.

Jarod_ said:
In my PHP code I do the below:
PHP:
// use SHA-256
$ctxHash = hash_init('sha256');
hash_update($ctxHash, $clientModulus);
hash_update($ctxHash, $clientExponent);
hash_update($ctxHash, $serverModulus);
hash_update($ctxHash, $serverExponent);
// only keep the last two characters of the code
hash_update($ctxHash, hex2bin(sübstr($code, 2, 4))); /// HERE
$alpha = hash_final($ctxHash, true);
So, I convert the last two characters from hexadecimal to bin.
Click to expand...
Click to collapse
hi thanks for replying!
from this PHP code it apears we take the last 4 charecters since substr("123456",2,4) should return "3456", the js implemention seems to do so as well
i am trying to implement it in java but my code doesnt work for some reason - i would appreciate if you would take a look:
Code:
PublicKey publicKey = certificate.getPublicKey();
PublicKey publicKey2 = s.getSession().getPeerCertificates()[0].getPublicKey();
if(!(publicKey instanceof RSAPublicKey) || !(publicKey2 instanceof RSAPublicKey)){
System.out.println("Expecting RSA public key");
}
RSAPublicKey rSAPublicKey = (RSAPublicKey) publicKey;
RSAPublicKey rSAPublicKey2 = (RSAPublicKey) publicKey2;
try {
MessageDigest instance = MessageDigest.getInstance("SHA-256");
byte[] bArr = new BigInteger(text.substring(2),16).toByteArray();
bArr = removeLeadingNullBytes(bArr);
byte[] byteArray = rSAPublicKey.getModulus().abs().toByteArray();
byte[] byteArray2 = rSAPublicKey.getPublicExponent().abs().toByteArray();
byte[] byteArray3 = rSAPublicKey2.getModulus().abs().toByteArray();
byte[] byteArray4 = rSAPublicKey2.getPublicExponent().abs().toByteArray();
byte[] removeLeadingNullBytes = removeLeadingNullBytes(byteArray);
byte[] removeLeadingNullBytes2 = removeLeadingNullBytes(byteArray2);
byte[] removeLeadingNullBytes3 = removeLeadingNullBytes(byteArray3);
byte[] removeLeadingNullBytes4 = removeLeadingNullBytes(byteArray4);
instance.update(removeLeadingNullBytes);
instance.update(removeLeadingNullBytes2);
instance.update(removeLeadingNullBytes3);
instance.update(removeLeadingNullBytes4);
instance.update(bArr);
byte[] one = {8,2,16, (byte) 200,1, (byte) 194,2,34,10,32};
byte[] two = instance.digest();
byte[] combined = new byte[one.length + two.length];
for (int i = 0; i < combined.length; ++i){
combined[i] = i < one.length ? one[i] : two[i - one.length];
}
socketOutputStream.write(combined);
remove leading null bytes in my code returns new byte[] without any 0 at the start

Yes, you're correct it's the last 4 digits!
I don't do Java… I found some code on the Web that I put in the documentation.

Jarod_ said:
Yes, you're correct it's the last 4 digits!
I don't do Java… I found some code on the Web that I put in the documentation.
Click to expand...
Click to collapse
finaly managed to pull it off!
the problem was the byte[] named "one" (the start of the payload)
Code:
byte[] one = {8,2,16, (byte) 200,1, (byte) 194,2,34,10,32};
turns out the payload shoud start with the overall length which is 42 so replacing this line with:
Code:
byte[] one = {42,8,2,16, (byte) 200,1, (byte) 194,2,34,10,32};
fixed the problem
i suppose its something you might want to add to your doc as well

Eliran123 said:
finaly managed to pull it off!
the problem was the byte[] named "one" (the start of the payload)
Code:
byte[] one = {8,2,16, (byte) 200,1, (byte) 194,2,34,10,32};
turns out the payload shoud start with the overall length which is 42 so replacing this line with:
Code:
byte[] one = {42,8,2,16, (byte) 200,1, (byte) 194,2,34,10,32};
fixed the problem
i suppose its something you might want to add to your doc as well
Click to expand...
Click to collapse
"42" is the message size, so yes you have to send it all the time. I'll update the doc to clarify.

Related

CameraCaptureDialog in VS2005/CF2

Has anyone used the CameraCaptureDialog successfully on a PDA with camera to capture an image to a file?
I tried the following code on my O2 Atom (a camera-equipped PDA phone running Windows Mobile 5.0 & CF2) but all I get is a static image in the dialog. After clicking OK in the dialog, nothing happens. The image is not saved, which should not be the case. Doing a trace in debug mode shows that the FileName property is an empty string immediately after the ShowDialog() call.
CameraCaptureDialog c = new CameraCaptureDialog();
c.DefaultFileName = "test.jpg";
c.InitialDirectory = @"\My Documents";
c.ShowDialog();
(I've posted a similar to another thread. Hope it's ok to start a new thread.)
I have used successfullly with my Qtek 9100 (htc wizard).
But it annoys me that I have to click the releasebutton in the cameradialog to retrieve the picture. I would really like to capture a picture directly from .net CF
Andreas
andemann said:
But it annoys me that I have to click the releasebutton in the cameradialog to retrieve the picture. I would really like to capture a picture directly from .net CF
Click to expand...
Click to collapse
Hi Andreas, for my case, I don't see any button in the dialog, but the left softkey is Cancel and the right softkey is Menu (for adjusting properties like brightness and quality). And at the top-right is the OK. I assume that clicking OK captures the picture and saves it as a file (for my case, it doesn't).
Could you tell me more about the releasebutton? And doesn't the CameraCaptureDialog save a file to the ROM after snapping the picture?
Thanks for the reply!
On my device I have a dedicated camerabutton, when I press this button, the picture is captured and the cameradialog asks me if I want to save the picture and return to the application or delete it (take another)
Andreas
Well I guess I'll move on to see if it can be done with unmanaged code. I had wanted to use a camera api that works on all WM5 devices. Since there's the CameraCaptureDialog class for managed code, I assume it's definitely doable with low level code.
Does anyone know where's a good place to start searching for info?
methods
I try to do the same on an Universal
I find an interesting thread on http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=253920&SiteID=1 but I can't achieve realize it.
I try that method and I find that loading the CameraDialog open two windows who's classnames are "WCE_IA_Camera_Main" (and a subwindow "WCE_IA_Camera_Skin") and "IACW_AGENT". I try the method exlained on the thread for each window but this didn't make the trick.
I create a thread who is launched before calling the cameraDialog and in this thread, I send message press enter to the camera handle window (I hope) : SendMessage(hCamWnd, WM_KEYDOWN, VK_ENTER, NULL)
I didn't work. Any tips ?
PS: there is a method with directShow who is much more difficult
I have the same issue about the FileName. The string is empty just after the CameraCaptureDialog is openned.
but here is the method i used to take automatic captures:
I started a timer just after the dialog is openned and simulated the message sent by the capture button on my PDA... first u need the message number and the parameters it is used... here is how to get it..
1. open Remote spy from visual studio remote tools in all programs.
2. Connect to your Smartphone or PDA.
3. open the camera and from Remote spy.. click on Target>> Refresh.
4. check the windows list and you will find a camera window. choose it and from spy menu click messages.
5. now remote spy will show you all messages that is sent to the camera dialog, so it's time to press the capture button or equivalent from your smartphone or PDA. and after you press it close the camera dialog.
6. in the messages window check for the message sent when you pressed the capture button. take the message value, wparam, and LParam. *you might get two messages for the same button press. like key_Up and key_Down. mine worked with the key_Up. you might need to do some tries to find the right message neway*
now you have everything you need to simulate the capture key.
in ur code u will need to import both GetForeGroundWindow and SendMessage functions from CoreDll. and after openning the camera dialog enable a time to make sure the cameraDialog is openned and worked fine and then when the time ticks get the CameraDialog window handle using GetForeGroundWindow and the send the capture button message to it using SendMessage.
here is my full code.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.WindowsMobile.Forms;
using System.Runtime.InteropServices;
using Microsoft.WindowsMobile.PocketOutlook;
using Microsoft.WindowsMobile.Status;
namespace CamCapture
{
unsafe public partial class Form1 : Form
{
[DllImport("CoreDll")]
public static extern IntPtr FindWindow(
string lpClassName, // class name
string lpWindowName // window name
);
[DllImport("CoreDll")]
public static extern IntPtr SendMessage(
IntPtr hWnd, // handle to destination window
uint Msg, // message
uint wParam, // first message parameter
uint lParam // second message parameter
);
[DllImport("CoreDll")]
public static extern IntPtr GetForegroundWindow();
public Form1()
{
InitializeComponent();
}
private void menuItem2_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void menuItem1_Click(object sender, EventArgs e)
{
CameraCaptureDialog ccd = new CameraCaptureDialog();
ccd.Owner = this;
ccd.Mode = CameraCaptureMode.Still;
ccd.InitialDirectory = @"\My Documents\My Pictures";
ccd.DefaultFileName = @"test.jpeg";
ccd.Resolution = new Size(1600, 1280);
ccd.StillQuality = CameraCaptureStillQuality.High;
if (ccd.ShowDialog() == DialogResult.OK)
{
timer1.Enabled = true;
}
Show();
ccd.Dispose();
}
private void timer1_Tick(object sender, EventArgs e)
{
IntPtr hwnd = GetForegroundWindow();
SendMessage((IntPtr)hwnd, 0x201, 0x1, 0x10000D);
timer1.Enabled = false;
}
}
}
i took 10 pictures and i cant recognize who is the press button event
{
"lightbox_close": "Close",
"lightbox_next": "Next",
"lightbox_previous": "Previous",
"lightbox_error": "The requested content cannot be loaded. Please try again later.",
"lightbox_start_slideshow": "Start slideshow",
"lightbox_stop_slideshow": "Stop slideshow",
"lightbox_full_screen": "Full screen",
"lightbox_thumbnails": "Thumbnails",
"lightbox_download": "Download",
"lightbox_share": "Share",
"lightbox_zoom": "Zoom",
"lightbox_new_window": "New window",
"lightbox_toggle_sidebar": "Toggle sidebar"
}
furthermore text format is last example is very different from: SendMessage((IntPtr)hwnd, 0x201, 0x1, 0x10000D);
thanks
you will need to watch the remote spy for a while without clicking the button so you recognise the normal messages that is always sent by the camera. And after that you can click the capture button and you will notice a different message on the messages window. The only way you know it is by watching the remote spy window for a while, then try and error.
I let him 1 minute without move it and close it and the messages are the same. next other minute and took 5 pictures consecutives without move camera and same result
Exist a solution in mortscript, bit i need take picture while send bluetooth messages and script language dont let do both things at the same time (sorry for my bad english)
if question "Please set the Camera app to photo mode before executing this script. Additionally, please remember to disable <<Reviev After Capture>> option in Camera before running this script! Run the script?","Important note"
setbacklight 1,1
Input limit, 1, "Total images to capture","MultiCapture"
if equals "",%limit%
set limit,10
endif
set total,0
Input delayer, 1, "Capture interval (seconds)","MultiCapture"
set delayer,%delayer%*1000
if equals %delayer%,0
set delayer,1000
endif
%czas%=%delayer%*%limit%/1000
%czas_m%=%czas%/60
%czas%="Total capture time: "&%czas%&" seconds, this is "&%czas_m%&" minutes."
message %czas%,"MultiCapture"
if question "Lock the touchscreen?","Touchscreen lock"
run tpdisable.exe
endif
run camera.exe
WaitForActive "Camera",10
setbacklight 0,0
while wndActive "Camera"
SendCR "Camera"
sleep %delayer%
%total%=%total%+1
if equals %total%,%limit%
Close "Camera"
endif
endwhile
run tpenable.exe
%total%="Images captured: " & %total%
message %total%,"Done"
endif
Click to expand...
Click to collapse
thanks for answer

[SKINS][M2D Style] DJkoa's 3G Dialer Black/M2D, Comm Manager M2D & WM6.5 Wallpape M2D

[SKINS][M2D Style] DJkoa's 3G Dialer Black/M2D, Comm Manager M2D & WM6.5 Wallpape M2D
i skinned DJKoa's 3G dialer - for now portrait only, but it has some minor bugs would be great if some1 can help solve em...
{
"lightbox_close": "Close",
"lightbox_next": "Next",
"lightbox_previous": "Previous",
"lightbox_error": "The requested content cannot be loaded. Please try again later.",
"lightbox_start_slideshow": "Start slideshow",
"lightbox_stop_slideshow": "Stop slideshow",
"lightbox_full_screen": "Full screen",
"lightbox_thumbnails": "Thumbnails",
"lightbox_download": "Download",
"lightbox_share": "Share",
"lightbox_zoom": "Zoom",
"lightbox_new_window": "New window",
"lightbox_toggle_sidebar": "Toggle sidebar"
}
bugs:
-while in video call & go to keypad video is seen between the numbers
-in incall window some buttons have transparent lane in the middle although all buttons is the SAME picture exactly i just renamed it...
and i would like to change the yellow bar in dialer how is it possible?
install DJKoa's v2 dialer, replace files in windows folder & sr.
for white text on buttons:
HKLM\Security\Phone\Skin\Progress\portrait\talkendbutton\textcolor:1672215
HKLM\Security\Phone\Skin\Progress\portrait\verbbuton\textcolor:1672215
i only colored the slider, icons found here on xda credits to creator/s.
replace files in windows folder & sr.
for white text:
HKLM\Software\HTC\CommManager\TextColorSetting:FF FF FF 00 FF FF FF 00 FF FF FF 00 99 99 99 00 BB BB BB 00 BB BB BB 00 99 99 99 00 BB BB BB 00 BB BB BB 00 99 99 99 00
& matching background for wm6.5 - also replace file in windows folder & sr.
Wow, this is really nice. Keem it comming. One question: what taskbar icons do you use?
mix of arthemus & omnia icons from HERE
that is so great thanks but
how i can ad arabic alphabetic to the dilar its help with the search other lang to
al7alm said:
that is so great thanks but
how i can ad arabic alphabetic to the dilar its help with the search other lang to
Click to expand...
Click to collapse
its pictures not text...you have to edit the button pictures.
i made it with photoshop text arial size 10.
Question...
How do you get those 4X4 icons in the start menu? Is there a cab or something floating around for it?
Also, that comm manager, is that in TF3D or TF3D2. If TF3D2, how do you do that...like get it to work?
linux4ever1 said:
How do you get those 4X4 icons in the start menu? Is there a cab or something floating around for it?
Also, that comm manager, is that in TF3D or TF3D2. If TF3D2, how do you do that...like get it to work?
Click to expand...
Click to collapse
for 4x4 icon replace attached file in windows folder,
the comm manager is default i only replaced graphics... install as said and yours should look the same.
Thank-you...
Awesome, thank-you very much 4 the info.
far too many flashy colors
bbezja1 said:
far too many flashy colors
Click to expand...
Click to collapse
for me it was easier to see specially at night...
is there a stand alone cab file for that comm manager ? I have a 6 button comm manager but it doesn't have airplane mode
ryche316 said:
is there a stand alone cab file for that comm manager ? I have a 6 button comm manager but it doesn't have airplane mode
Click to expand...
Click to collapse
there is no cab,
you can change comm manager buttons with advanced config.

Stuck on sending IrDa signals with serial port communication (.NET)

Hello there,
To keep the story short, i want to make an IR Remote control software for my Windows Mobile 5.0 powered Asus A696 using the Serial port communication class from .NET Compact Framework 3.5 and i'm coding C#.
THIS IS WHEN THE FORM OPENS:
//Create and open serial port
Infrarosu = new SerialPort("COM3");
if (Infrarosu.IsOpen == false)
{
Infrarosu.BaudRate = 9600;
Infrarosu.Open();
if (Infrarosu.IsOpen)
this.statusBar1.Text="Am deschis portul!";
}
//Remote code for Power button on a WDTV
hexString = "900A 0068 0000 0001 8479 12ED";
//Transform from HEX STRING to BYTES[] using a class from CodeProject
byteArray = HexEncoding.GetBytes(hexString, out discarded);
THESE INSTRUCTIONS EXECUTE WHEN A BUTTON IS CLICKED:
try
{
this.statusBar1.Text = "";
Infrarosu.Write(byteArray, 0, byteArray.Length);
for (i=1;i<=byteArray.Length;i++)
this.statusBar1.Text = this.statusBar1.Text+""+byteArray.ToString();
}
catch (System.IO.IOException)
{
statusBar1.Text="Exception!";
}
The problem is that at first it threw me the IOException, then after implementing try-catch it said that it sent the data correctly but the wdtv wouldn't power on and now it threw me IOException again.
Does anyone have any ideas, advice or anything that can be useful?
Thanks a million!

[Q] Searching through flat files

Hello,
Does anyone knows of a good resource where I can learn how to search/find through a flat file? I have a flat file that each character in the row is separated by a space (ex: 01242 PHXX) and all I am trying to do is search for the first characters (01242) but display the second set of characters (PHXX). I been searching online and so far I have gotten as far as being able to display the content of the flat file but nothing specific on how to go about doing what I am trying to do.
Any advice will be greatly appreciated.
Have you looked at StringTokenizer()?
http://developer.android.com/reference/java/util/StringTokenizer.html
Gene Poole said:
Have you looked at StringTokenizer()?
http://developer.android.com/reference/java/util/StringTokenizer.html
Click to expand...
Click to collapse
Thanks!! It helped so much. I to looked deeper into StringTokenizer and using several of tutorials I was able to exactly do what I was looking for:
Code:
InputStream file = getResources().openRawResource(R.raw.file_raw_data);
Scanner scan = new Scanner(file);
search = (int) search1;
outer_loop:
while (scan.hasNextLine()) {
String line = scan.nextLine();
StringTokenizer st = new StringTokenizer(line, " ");
while (st.hasMoreTokens()) {
String word = st.nextToken();
String test1 = st.nextToken();
if (word.equals(search)) {
Firstconvert.setText(test1);
break outer_loop;
} else {
Firstconvert.setText("Not Found");
}
}
}
scan.close();
It may not be perfect but at least its a very good start. Thank you so much again!!

[TOOL][APP][WIP] Native AT Command Injector

I trying to develop an application that can send AT commands directly to modem, from a native application interface (or possibly via terminal).
There are many obstacles here, but the main one is that the modem AT interface is rarely available through a simple serial device, which is why all other AT command apps always fail for the Samsung Galaxy class devices, which use a modified IPC protocol over sockets. However, by using the built-in RIL_OEM_HOOK_RAW and RIL_OEM_HOOK_STR we should be able to do this.
I then found this document for the Ublox LISA-U2 UMTS/HSPA voice and data modules, which show an example Android App, including most of the code used in that App. However, I cannot get this to compile in Eclipse. I think the reason is that there are many cosmetic changes in the AOS, while there are many typos in the code in that document.
I would very much like to get this or something very similar to work. I'm mainly developing on the Samsung Galaxy S2 (GB).
Here is a picture (from that document).
{
"lightbox_close": "Close",
"lightbox_next": "Next",
"lightbox_previous": "Previous",
"lightbox_error": "The requested content cannot be loaded. Please try again later.",
"lightbox_start_slideshow": "Start slideshow",
"lightbox_stop_slideshow": "Stop slideshow",
"lightbox_full_screen": "Full screen",
"lightbox_thumbnails": "Thumbnails",
"lightbox_download": "Download",
"lightbox_share": "Share",
"lightbox_zoom": "Zoom",
"lightbox_new_window": "New window",
"lightbox_toggle_sidebar": "Toggle sidebar"
}
Any help with this would be very very much appreciated!
It will also benefit the rest of the community as it will provide a foundation
for my future development of many other things to come, for free!
BTW. The BP used in that device is the very popular Intel/Infineon XGOLD-626...
When trying to run the code shown below in Eclipse (using GB 2.3.3+),
it fails with the following errors:The import com.android.internal.telephony cannot be resolved
The import android.os.AsyncResult cannot be resolved​It seem like it doesn't recognize these imports:
Code:
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import android.os.AsyncResult;
The java code is:
Code:
[SIZE=2]
/*=========================================================
Demo App Code by Ublox, modified copy and paste from:
http://www.u-blox.com/images/downloads/Product_Docs/AndroidRIL_Source_Code_ApplicationNote_%283G.G2-CS-11003%29.pdf
=========================================================== */
package com.testapp.sat;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import android.view.View.OnKeyListener;
import android.view.KeyEvent;
import android.os.Message;
import android.os.Handler;
import android.os.AsyncResult;
import android.util.Log;
import android.app.AlertDialog;
public class RilOemHookTest extends Activity
{
private static final String LOG_TAG = "RILOemHookTestApp";
private RadioButton mRadioButtonAPI1 = null;
private RadioGroup mRadioGroupAPI = null;
private Phone mPhone = null;
private EditText CmdRespText = null;
private static final int EVENT_RIL_OEM_HOOK_CMDRAW_COMPLETE = 1300;
private static final int EVENT_RIL_OEM_HOOK_CMDSTR_COMPLETE = 1400;
private static final int EVENT_UNSOL_RIL_OEM_HOOK_RAW = 500;
private static final int EVENT_UNSOL_RIL_OEM_HOOK_STR = 600;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.riloemhook_layout);
mRadioButtonAPI1 = (RadioButton) findViewById(R.id.radio_api1);
mRadioGroupAPI = (RadioGroup) findViewById(R.id.radio_group_api);
// Initially turn on first button.
mRadioButtonAPI1.toggle();
//Get our main phone object.
// mPhone = PhoneFactory.getDefaultPhone();
//Register for OEM raw notification.
// mPhone.mCM.setOnUnsolOemHookRaw(mHandler, EVENT_UNSOL_RIL_OEM_HOOK_RAW, null);
//Capture text edit key press
CmdRespText = (EditText) findViewById(R.id.edit_cmdstr);
CmdRespText.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
//If the event is a key-down event on the "enter" button
if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
//Perform action on key press
Toast.makeText(RilOemHookTest.this,
CmdRespText.getText(), Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
}
@Override
public void onPause()
{
super.onPause();
log("onPause()");
//Unregister for OEM raw notification.
// mPhone.mCM.unSetOnUnsolOemHookRaw(mHandler);
}
@Override
public void onResume()
{
super.onResume();
log("onResume()");
//Register for OEM raw notification.
// mPhone.mCM.setOnUnsolOemHookRaw(mHandler, EVENT_UNSOL_RIL_OEM_HOOK_RAW, null);
}
public void onRun(View view)
{
//Get the checked button
int idButtonChecked = mRadioGroupAPI.getCheckedRadioButtonId();
//Get the response field
CmdRespText = (EditText) findViewById(R.id.edit_response);
byte[] oemhook = null;
switch(idButtonChecked)
{
case R.id.radio_api1:
oemhook = new byte[1];
oemhook[0] = (byte)0xAA;
break;
case R.id.radio_api2:
oemhook = new byte[2];
oemhook[0] = (byte)0xBB;
oemhook[1] = (byte)0x55;
break;
case R.id.radio_api3:
//Send OEM notification (just echo the data bytes)
oemhook = new byte[7];
oemhook[0] = (byte)0xCC;
oemhook[1] = (byte)0x12;
oemhook[2] = (byte)0x34;
oemhook[3] = (byte)0x56;
oemhook[4] = (byte)0x78;
oemhook[5] = (byte)0x9A;
oemhook[6] = (byte)0xBC;
break;
case R.id.radio_api4:
//Send OEM command string
break;
default:
log("unknown button selected");
break;
}
if (idButtonChecked!=R.id.radio_api4) {
Message msg =
mHandler.obtainMessage(EVENT_RIL_OEM_HOOK_CMDRAW_COMPLETE);
mPhone.invokeOemRilRequestRaw(oemhook, msg);
CmdRespText.setText("");
} else {
//Copy string from EditText and add carriage return
String[] oemhookstring = { ((EditText)
findViewById(R.id.edit_cmdstr)).getText().toString()+'\r' } ;
//Create message
Message msg =
mHandler.obtainMessage(EVENT_RIL_OEM_HOOK_CMDSTR_COMPLETE);
//Send request
mPhone.invokeOemRilRequestStrings(oemhookstring, msg);
CmdRespText = (EditText) findViewById(R.id.edit_response);
CmdRespText.setText("---Wait response---");
}
}
private void logRilOemHookResponse(AsyncResult ar) {
log("received oem hook response");
String str = new String("");
if (ar.exception != null) {
log("Exception:" + ar.exception);
str += "Exception:" + ar.exception + "\n\n";
}
if (ar.result != null)
{
byte[] oemResponse = (byte[])ar.result;
int size = oemResponse.length;
log("oemResponse length=[" + Integer.toString(size) + "]");
str += "oemResponse length=[" + Integer.toString(size) + "]" + "\n";
if (size > 0) {
for (int i=0; i<size; i++) {
byte myByte = oemResponse[i];
int myInt = (int)(myByte & 0xFF);
log("oemResponse[" + Integer.toString(i) + "]=[0x" +
Integer.toString(myInt,16) + "]");
str += "oemResponse[" + Integer.toString(i) + "]=[0x" +
Integer.toString(myInt,16) + "]" + "\n";
}
}
} else {
log("received NULL oem hook response");
str += "received NULL oem hook response";
}
// Display message box
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(str);
builder.setPositiveButton("OK", null);
AlertDialog alert = builder.create();
alert.show();
}
private void logRilOemHookResponseString(AsyncResult ar) {
log("received oem hook string response");
String str = new String("");
CmdRespText = (EditText) findViewById(R.id.edit_response);
if (ar.exception != null) {
log("Exception:" + ar.exception);
str += "Exception:" + ar.exception + "\n\n";
}
if (ar.result != null) {
String[] oemStrResponse = (String[])ar.result;
int sizeStr = oemStrResponse.length;
log("oemResponseString[0] [" + oemStrResponse[0] + "]");
CmdRespText.setText( "" + oemStrResponse[0] );
} else {
log("received NULL oem hook response");
CmdRespText.setText( "No response or error received" );
}
}
private void log(String msg) {
Log.d(LOG_TAG, "[RIL_HOOK_OEM_TESTAPP] " + msg);
}
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
AsyncResult ar;
switch (msg.what) {
case EVENT_RIL_OEM_HOOK_CMDRAW_COMPLETE:
log("EVENT_RIL_OEM_HOOK_CMDRAW_COMPLETE");
ar = (AsyncResult) msg.obj;
logRilOemHookResponse(ar);
break;
case EVENT_RIL_OEM_HOOK_CMDSTR_COMPLETE:
log("EVENT_RIL_OEM_HOOK_CMDSTR_COMPLETE");
ar = (AsyncResult) msg.obj;
logRilOemHookResponseString(ar);
break;
case EVENT_UNSOL_RIL_OEM_HOOK_RAW:
break;
case EVENT_UNSOL_RIL_OEM_HOOK_STR:
break;
}
}
};
}
[/SIZE]
------------------ EDIT ---------------------
Of course they aren't recognized! They are internal packages not available outside the standard AOS API's. But I'm very stubborn and have now spent 2 days trying to use those damn packages anyway! I managed! I will post an update here and a whole new thread on how that is done, once I can get some other bugs out of the way...
new thread posted?
Here is my new thread on how to use and import internal packages into your project,
including instructions for hacking Eclipse ADT plugin, in order to allow for using
the com.android.internal classes.
"[APP][DEV][GUIDE] Using the Android Java Internal/Hidden API classes"
It is work in progress (WIP), and include a lot of manual file manipulations.
As such it is closely related to this thread. So keep an eye open for updates.
EDIT: 2014-01-06
That thread still work for API-17 JAR's!!
So, I managed to get it to compile but not without two main issues.
0) I got it to run on an SGS2 running GB2.3.4, but it FC's after being run.
1) I kept on getting AlertDialog builder complaints like:
"the constructor AlertDialog.Builder is undefined" so I had to comment out all code related to that. I searched for fixes, but since I'm not a Java programmer, I could not resolve this in the proper way...
2) Then I ran into some other undocumented errors from my own built (according to instructions) android.jar, so I just used the inazaruk's pre-made one, and it compiled. Here are his files:
https://github.com/inazaruk/android-sdk/tree/master/platforms
The main point is that we should not expect to blindly use the Ublox code and think it will work. Instead we need to understand the following:
a) How to properly use the RIL constants
Code:
[SIZE=2]RILConstants.java:
int RIL_REQUEST_OEM_HOOK_RAW = 59;
int RIL_REQUEST_OEM_HOOK_STRINGS = 60;
int RIL_UNSOL_OEM_HOOK_RAW = 1028;
my code:
EVENT_RIL_OEM_HOOK_CMDRAW_COMPLETE
EVENT_RIL_OEM_HOOK_CMDSTR_COMPLETE
EVENT_UNSOL_RIL_OEM_HOOK_RAW
EVENT_UNSOL_RIL_OEM_HOOK_STR
[/SIZE]
b) What the various bytecodes sent, are actually doing, and how to make them do what we want.
Code:
[SIZE=2] case R.id.radio_api1:
oemhook = new byte[1];
oemhook[0] = (byte)0xAA;
break;
case R.id.radio_api2:
oemhook = new byte[2];
oemhook[0] = (byte)0xBB;
oemhook[1] = (byte)0x55;
break;
case R.id.radio_api3:
//Send OEM notification (just echo the data bytes)
oemhook = new byte[7];
oemhook[0] = (byte)0xCC;
oemhook[1] = (byte)0x12;
oemhook[2] = (byte)0x34;
oemhook[3] = (byte)0x56;
oemhook[4] = (byte)0x78;
oemhook[5] = (byte)0x9A;
oemhook[6] = (byte)0xBC;
break;
[/SIZE]
c) If we can simplify the code to just send ONE hard-coded AT command and read the response.
d) alternatively use a completely different method, that will undoubtedly work, but will be device dependent. I'm talking about the (Samsung modified) IPC modem-communication protocols, as discussed in my older threads...
e) Find out how to use a local shell + device to send AT commands directly to BP.
To monitor the radio and related messages from the App (on a Sumsung) , you can use:
Code:
[SIZE=2]adb shell logcat AndroidRuntime:* ActivityManager:* dalvikvm:* DataRouter:E NetdConnector:D *:s
[/SIZE]
I've done similar work in my SprintDiagnostics app included in our Eos project. Its in the sprint gnex thread. There's no way to make this a user app as you have to be on the Phone looper thread. Meaning you have to declare the phone process in the manifest for the activity calling the raw ril requests. I can grab msl, write prl, and some other good stuff. And enable diagnostic mode based on shell work from Autoprime.
Edit: http://git.teameos.org/eos/device/samsung/toroplus.git/tree/SprintDiagnostics?h=jellybean
bigrushdog said:
I've done similar work in my SprintDiagnostics app included in our Eos project. Its in the sprint gnex thread. There's no way to make this a user app as you have to be on the Phone looper thread. Meaning you have to declare the phone process in the manifest for the activity calling the raw ril requests. I can grab msl, write prl, and some other good stuff. And enable diagnostic mode based on shell work from Autoprime.
Edit: http://git.teameos.org/eos/device/samsung/toroplus.git/tree/SprintDiagnostics?h=jellybean
Click to expand...
Click to collapse
Hi! Thanks for interesting info, but unfortunately I don't understand all you're saying. But I got many more questions that answers.
First of all, what thread are you referring to? (Could you give a link?) Second, how do you do that declaration? (Code example?) BTW. I looked briefly at the code and must admit it seem a bit cryptic, as I didn't quite find the where AT's goes or are created. Third, what is "msl"? Do you have an APK to try on? Finally, what specific modem (cellular) processor are you running in that device? LTE?
Screenshots?
Thanks in advance.
Hi There
Forgive me if I'm oversimplifying it here but wouldn't minicom or some similar terminal program do this? I believe minicom is included in busybox.
Surely you could just wrap that around using JNI
AT Commands in android are sent natively by the vendor implemented ril library, normally set in global properties as rild.libpath. It may be worth stepping away from the JAVA code for a moment and looking at the rild and reference-ril sources in the aosp source. The atchannel.c is where the "magic" happens. Also If you haven't already, read PDK Telephony Documentation
When you get down to it, all you really want to do is read and write from a tty character device so doing it "raw" is always an option.
Also to monitor the Radio log in android use adb logcat -b radio , You will be enlightened as you watch the AT commands fly by!
trevd said:
Forgive me if I'm oversimplifying it here but ...
Also to monitor the Radio log in android use adb logcat -b radio , You will be enlightened as you watch the AT commands fly by!
Click to expand...
Click to collapse
No, you are missing the entire point of this thread. We are trying to circumvent actually using the vendor RIL, by tunneling the commands via the OEM_RAW requests. That is because it is often filtering out non-standard OEM AT commands that are not part of the common standard. These are all dependent on the BP/CP and and varies widely from device to device. In addition on many devices the direct modem serial is either not possible (because there is no such connection/transport) or it has been blocked/disabled. The Java way of circumventing this, is what this thread is all about. In addition the "-b radio" logcat doesn't fetch ATs sent by vendor specific OEM IPCs, for example. This is the case for the SGS2 (GT-I9100) and many other devices.
E:V:A said:
No, you are missing the entire point of this thread.
Click to expand...
Click to collapse
Ah, Okay...If I had a SGS2 too play with I'd probably join in on this little adventure, but I don't
trevd said:
Ah, Okay...If I had a SGS2 too play with I'd probably join in on this little adventure, but I don't
Click to expand...
Click to collapse
Well again... The point is that: RIL_OEM_HOOK_RAW and RIL_OEM_HOOK_STR are (internally) accessible for all RIL's. Which means that you CAN join in!
E:V:A said:
Hi! Thanks for interesting info, but unfortunately I don't understand all you're saying. But I got many more questions that answers.
First of all, what thread are you referring to? (Could you give a link?) Second, how do you do that declaration? (Code example?) BTW. I looked briefly at the code and must admit it seem a bit cryptic, as I didn't quite find the where AT's goes or are created. Third, what is "msl"? Do you have an APK to try on? Finally, what specific modem (cellular) processor are you running in that device? LTE?
Screenshots?
Thanks in advance.
Click to expand...
Click to collapse
My apologies for not responding sooner. I forgot to subscribe ;( . I'd like to try and clear up my previous post as well as try to shed some light on this topic. First, I'm by no means a telephony expert. I've read some of your other threads and found them remarkable. I write Java and do feature development in a AOSP project. I currently am doing telephony work on Samsun Sprint CDMA devices including galaxy nexus, nexus s, and working on s3. As you know, those use the VIA chipset. However, working through the Android radio layer makes that irrelevant, for the most part. I've also worked with Autoprime on some telephony/modem/ril matters.
First some code and background on what I have done on Sprint Galaxy Nexus. These are some code fragments from my CDMATools app.
Manifest:
Code:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.teameos.settings.device"
android:sharedUserId="android.uid.system"
android:versionCode="1"
android:versionName="1.0" >
Of importance if the android.uid.system uid. This allows the app to access the phone process, which is required for PhoneFactory.getDefaultPhone(); The following activity queries ril for a Master Subsidy Lock code (msl)
Code:
<activity
android:name=".MslActivity"
android:label="@string/msl_activity"
android:process="com.android.phone" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
And the actual method which is used to query the radio...
Code:
private void checkMSLCode()
{
ByteArrayOutputStream bytearrayoutputstream;
DataOutputStream dataoutputstream;
bytearrayoutputstream = new ByteArrayOutputStream();
dataoutputstream = new DataOutputStream(bytearrayoutputstream);
try {
dataoutputstream.writeByte(main_cmd_hidden);
dataoutputstream.writeByte(OEM_SUB_CMD_GET_MSL);
dataoutputstream.writeShort(device_short);
if (isTuna) {
dataoutputstream.writeByte(OEM_SUB_RAW_MSL);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mPhone.invokeOemRilRequestRaw(bytearrayoutputstream.toByteArray(),
mHandler.obtainMessage(GET_MSL_DONE));
}
A snipit of the handler code to receive and process incoming messages from radio.
Code:
mHandler = new Handler() {
public void handleMessage(Message message) {
Log.i(LOG_TAG, "MSL response incoming!!");
AsyncResult asyncresult = (AsyncResult) message.obj;
if (asyncresult.exception != null)
{
Log.i(LOG_TAG, "AsyncResult Exception Occur!!!");
} else
if (asyncresult.result == null)
{
Log.i(LOG_TAG, "ar.result == NULL! - No answer for MSL response");
} else
{
byte abyte0[] = (byte[]) (byte[]) asyncresult.result;
String s = new String("");
for (int j = 0; j < 6; j++)
s = (new StringBuilder()).append(s).append((char) abyte0[j]).toString();
Intent intent = new Intent().setAction(getString(R.string.msl_action));
intent.putExtra(getString(R.string.msl_key), Integer.parseInt(s));
mContext.sendBroadcast(intent);
finish();
}
}
};
I have been able to get the raw commands from RE'ing various device proprietary apk's. Of importance to this topic is this checkMSLCode() function. This is the equivalent of raw AT commands, but being passed though the Android radio layer. From looking at the code for that AT command application you posted in the OP, it uses a similar structure. In fact, if time permits, i'm confident i can expand on it and make it somewhat more robust. One problem is see is finding an effective way to interpret the AT command responses from the radio. Requests often get a response in different forms, thus requiring a unique handler for each function. Of course, we could always do a Object.toString() to the log and try to decipher it. I hope this info sheds some light on the topic. I'll post when I come up with more.
Edit: also I should note, i build this apk inside of my AOSP repo, so it sees all the internal api automatically. I'm now looking at using reflection to do some telephony stuff, but it's proving rather tricky.
Very nice! (That was an understatement!)
I just wish I knew how to apply that...
Regarding the raw command (and their appropriate responses), I think there is both code and documents available for this, for Qualcomm chips. I know nothing about the VIA chipsets, but a whole lot more about the Qualcomm MSM stuff... Many CDMA devices use just Qualcomm, so perhaps you've been across some of these. I bet we could get this working on them, somehow.
Since, just as you said, the RIL should take care of much of the details. We just need to apply the command requests and responses. But my Java App making skills are really not even worthy a try at the moment.
Somebody else who'd care to join us, to give this a try?
As an aside and a note of reference, mostly to myself. (For a professional OEM programmer, this may be obvious, but me it's not. ) After having dug through some of the QC MSM code, I've come to the conclusion that QC like to use what they (?) call SMD (Shared memory Device) for doing their IPC stuff, which include talking to modem. While for Infineon/Intel modem, we know that Samsung have developed their own (non-standard) IPC protocol version for this communication...
While rewriting my Cdmatools app making it fragment based, I used reflection to access all the hidden apis. I'll fork the source for the at command app and apply the reflected classes.
I also got access to my Samsung Galaxy S3 via Reflection... although I had to go AOSP and sign with they same system key to run as looper. But now I just need help with what to send........ via RAW/String
bigrushdog said:
While rewriting my Cdmatools app making it fragment based, I used reflection to access all the hidden apis. I'll fork the source for the at command app and apply the reflected classes.
Click to expand...
Click to collapse
Excellent. Where can we download this?
Have you been able to make demo App or something?
enigma99a said:
I also got access to my Samsung Galaxy S3 via Reflection... although I had to go AOSP and sign with they same system key to run as looper. But now I just need help with what to send........ via RAW/String
Click to expand...
Click to collapse
Can you elaborate? Do you need info on what AT commands to send, or are you asking about the protocol?
PS. I would be great if you could say something more about how you did it, so that perhaps other interested people can join in. We need more people on this, so that we can start working on THIS project.
my apologies that i've been unable to continue efforts on that project. My aosp project consumes all of my development time and then some. Here is the source for CDMATools. I was looking for ways to monetize it. However, due to android's permissions scheme, it's not gonna happen lol. so here ya go.
www.miuimods.com/bigrushdog/CDMATools.tar.bz2
compile in eclipse then sign with aosp platorm test keys. I use some libraries that require it be compiled in eclipse. and because of the internal telephony imports, it must have the platform signature. Also, because it's compiled in eclipse, i use reflection to access internal telephony. Of interest will be the Phone service class. everything else is just ui. Look at how i structure the reflection. You can reflect all the internal telephony calls in the same fashion. any issues, just hit me. but my time now is very limited as I have a large team to manage and my plate is more than full. Good luck!
feel free to post on github, distribute, or whatever.
So I have not yet had time to modify OP app or using bigrushdog's CDMAtools. But I will soon. In the meantime I just post the internals for the _OEM_HOOK_ statements.
The code base is here:
https://android.googlesource.com/platform/frameworks/base.git/
So from the JellyBean RIL.java:
Code:
[SIZE=2]public void invokeOemRilRequestRaw(byte[] data, Message response) {
RILRequest rr = RILRequest.obtain(RIL_REQUEST_OEM_HOOK_RAW, response);
if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+ "[" + IccUtils.bytesToHexString(data)
+ "]");
rr.mp.writeByteArray(data);
send(rr);
}
public void invokeOemRilRequestStrings(String[] strings, Message response) {
RILRequest rr = RILRequest.obtain(RIL_REQUEST_OEM_HOOK_STRINGS, response);
if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
rr.mp.writeStringArray(strings);
send(rr);
}[/SIZE]
And the expected response can be found in the ril.h:
Code:
[SIZE=2]#define [B]RIL_REQUEST_DATA_REGISTRATION_STATE[/B] 21
/**
* RIL_REQUEST_DATA_REGISTRATION_STATE
*
* Request current DATA registration state
*
* "data" is NULL
* "response" is a "char **"
* ((const char **)response)[0] is registration state 0-5 from TS 27.007 10.1.20 AT+CGREG
* ((const char **)response)[1] is LAC if registered or NULL if not
* ((const char **)response)[2] is CID if registered or NULL if not
* ((const char **)response)[3] indicates the available data radio technology,
* valid values as defined by RIL_RadioTechnology.
* ((const char **)response)[4] if registration state is 3 (Registration
* denied) this is an enumerated reason why
* registration was denied. See 3GPP TS 24.008,
* Annex G.6 "Additonal cause codes for GMM".
* 7 == GPRS services not allowed
* 8 == GPRS services and non-GPRS services not allowed
* 9 == MS identity cannot be derived by the network
* 10 == Implicitly detached
* 14 == GPRS services not allowed in this PLMN
* 16 == MSC temporarily not reachable
* 40 == No PDP context activated
* ((const char **)response)[5] The maximum number of simultaneous Data Calls that can be
* established using RIL_REQUEST_SETUP_DATA_CALL.
*
* [/SIZE]The values at offsets 6..10 are [COLOR=Blue][B]optional LTE[/B][/COLOR] location information in decimal.[SIZE=2]
* If a value is unknown that value may be NULL. If all values are NULL,
* none need to be present.
* ((const char **)response)[6] is TAC, a 16-bit Tracking Area Code.
* ((const char **)response)[7] is CID, a 0-503 Physical Cell Identifier.
* ((const char **)response)[8] is ECI, a 28-bit E-UTRAN Cell Identifier.
* ((const char **)response)[9] is CSGID, a 27-bit Closed Subscriber Group Identity.
* [COLOR=Red]((const char **)response)[10] is TADV, a 6-bit timing advance value.[/COLOR]
*
* LAC and CID are in hexadecimal format.
* valid LAC are 0x0000 - 0xffff
* valid CID are 0x00000000 - 0x0fffffff
*
* Please note that registration state 4 ("unknown") is treated
* as "out of service" in the Android telephony system
*
* Valid errors:
* SUCCESS
* RADIO_NOT_AVAILABLE
* GENERIC_FAILURE
*/
#define [B]RIL_REQUEST_OEM_HOOK_RAW[/B] 59
/**
* RIL_REQUEST_OEM_HOOK_RAW
*
* This request reserved for OEM-specific uses. It passes raw byte arrays
* back and forth.
*
* It can be invoked on the Java side from
* com.android.internal.telephony.Phone.invokeOemRilRequestRaw()
*
* "data" is a char * of bytes copied from the byte[] data argument in java
* "response" is a char * of bytes that will returned via the
* caller's "response" Message here:
* (byte[])(((AsyncResult)response.obj).result)
*
* An error response here will result in
* (((AsyncResult)response.obj).result) == null and
* (((AsyncResult)response.obj).exception) being an instance of
* com.android.internal.telephony.gsm.CommandException
*
* Valid errors:
* All
*/
#define [B]RIL_REQUEST_OEM_HOOK_STRINGS[/B] 60
/**
* RIL_REQUEST_OEM_HOOK_STRINGS
*
* This request reserved for OEM-specific uses. It passes strings
* back and forth.
*
* It can be invoked on the Java side from
* com.android.internal.telephony.Phone.invokeOemRilRequestStrings()
*
* "data" is a const char **, representing an array of null-terminated UTF-8
* strings copied from the "String[] strings" argument to
* invokeOemRilRequestStrings()
*
* "response" is a const char **, representing an array of null-terminated UTF-8
* stings that will be returned via the caller's response message here:
*
* (String[])(((AsyncResult)response.obj).result)
*
* An error response here will result in
* (((AsyncResult)response.obj).result) == null and
* (((AsyncResult)response.obj).exception) being an instance of
* com.android.internal.telephony.gsm.CommandException
*
* Valid errors:
* All
*/
[SIZE=2]#define [COLOR=Purple][B]RIL_REQUEST_RADIO_POWER[/B][/COLOR] 23
/**
* RIL_REQUEST_RADIO_POWER
*
* Toggle radio on and off (for "airplane" mode)
* If the radio is is turned off/on the radio modem subsystem
* is expected return to an initialized state. For instance,
* any voice and data calls will be terminated and all associated
* lists emptied.
*
* "data" is int *
* ((int *)data)[0] is > 0 for "Radio On"
* ((int *)data)[0] is == 0 for "Radio Off"
*
* "response" is NULL
*
* Turn radio on if "on" > 0
* Turn radio off if "on" == 0
*
* Valid errors:
* SUCCESS
* RADIO_NOT_AVAILABLE
* GENERIC_FAILURE
*/
[/SIZE]
[/SIZE]
The last one seem to imply that there could be other "bytes" to be read from that data[] array... Some suggestions have been the Transmitted power... But this was assuming a Qualcomm based modem, so there is no telling if there is another standard there. We don't know...
Here are links to two highly relevant threads on Gmane/GoogleGroups with code excerpts similar to what we need...
http://article.gmane.org/gmane.comp.handhelds.android.ndk/10555
http://article.gmane.org/gmane.comp.handhelds.android.platform/8436
https://groups.google.com/forum/?fromgroups=#!topic/android-platform/tVyNMnXtcEI
With a link to Google Phone G1 Field Test:
http://phoneftd.blogspot.com/2009/03/google-g1-phone-field-test.html

Categories

Resources